<?php

class RedisInit {

	private $redis; //redis对象

	/**
	 * 初始化Redis
	 * $config = array(
	 *  'server' => '127.0.0.1' 服务器
	 *  'port'   => '6379' 端口号
	 * )
	 * @param array $config
	 */
	public function __construct() {
		if(defined('XM_PARH'))
			include(XM_PATH.'/'.APPPATH.'config/config.php');
		else
			$config = array('redis_host'=>'127.0.0.1','redis_port'=>'6379');
		$this->redis = new Redis();
		$this->redis->connect($config['redis_host'], $config['redis_port']);
		return $this->redis;
	}

	/**
	 * 设置值
	 * @param string $key KEY名称
	 * @param string|array $value 获取得到的数据
	 * @param int $timeOut 时间
	 */
	public function set($key, $value, $timeOut = 0) {
		$value = json_encode($value);

		$retRes = $this->redis->set($key, $value);
		if ($timeOut > 0) $this->redis->setTimeout($key, $timeOut);
		return $retRes;
	}

	/**
	 * 更新值
	 * @param string $key KEY名称
	 * @param string|array $value 获取得到的数据
	 * @param int $timeOut 时间
	 */
	public function update($key, $value, $timeOut = 0) {
		$value = json_encode($value);
		$retRes = $this->redis->setex($key,$timeOut,$value);
		return $retRes;
	}

	/**
	 * 通过KEY获取数据
	 * @param string $key KEY名称
	 */
	public function get($key) {
		$result = $this->redis->get($key);
		return json_decode($result,true);
	}

	/**
	 * 模糊查找keys数据
	 */
	public function query($key='*')
	{
		$data = $this->redis->keys($key);
		$result = array();
		foreach($data as $k=>$v)
		{
			$result[$v] = self::get($v);
		}
		return $result;
	}

	/**
	 * 删除一条数据
	 * @param string $key KEY名称
	 */
	public function delete($key) {
		return $this->redis->delete($key);
	}

	/**
	 * 清空数据
	 */
	public function flushAll() {
		return $this->redis->flushAll();
	}

	/**
	 * 数据入队列
	 * @param string $key KEY名称
	 * @param string|array $value 获取得到的数据
	 * @param bool $right 是否从右边开始入
	 */
	public function push($key, $value ,$right = true) {
		$value = json_encode($value);
		return $right ? $this->redis->rPush($key, $value) : $this->redis->lPush($key, $value);
	}

	/**
	 * 数据出队列
	 * @param string $key KEY名称
	 * @param bool $left 是否从左边开始出数据
	 */
	public function pop($key , $left = true) {
		$val = $left ? $this->redis->lPop($key) : $this->redis->rPop($key);
		return json_decode($val);
	}

	/**
	 * 数据出队列
	 * @param string $key KEY名称
	 * @param bool $left 是否从左边开始出数据
	 */
	public function sadd($key , $value) {
		$value = json_encode($value);
		return $this->redis->sadd($key,$value) ;
	}

	public function scard($key) {
		return $this->redis->scard($key) ;
	}

	public function llen($key) {
		return $this->redis->llen($key) ;
	}

	/**
	 * 数据自增
	 * @param string $key KEY名称
	 */
	public function increment($key) {
		return $this->redis->incr($key);
	}

	/**
	 * 数据自减
	 * @param string $key KEY名称
	 */
	public function decrement($key) {
		return $this->redis->decr($key);
	}

	/**
	 * key是否存在，存在返回ture
	 * @param string $key KEY名称
	 */
	public function exists($key) {
		return $this->redis->exists($key);
	}

	/**
	 * 返回redis对象
	 * redis有非常多的操作方法，我们只封装了一部分
	 * 拿着这个对象就可以直接调用redis自身方法
	 */
	public function Redis() {
		return $this->redis;
	}

	/**
	 * hash操作
	 */
	 public function hsetnx($name,$key,$value,$timeOut=null)
	 {
	 	$value = json_encode($value);

		$retRes = $this->redis->hSetNx($name,$key,$value);
	 	if ($timeOut > 0) $this->redis->setTimeout($key, $timeOut);
		return $retRes;
	 }
	 public function hlen($name)
	 {
	 	return $this->redis->hlen($name);
	 }
	 public function lrange($name,$start,$end)
	 {
	 	return $this->redis->lrange($name,$start,$end);
	 }
}